Technical Note TN2090
Driver Tuning on Panther or G5

目次

このテクニカルノートでは、Panther(Mac OS X の次期メジャーバージョン)以降、ドライバの使用時に直面する可能性のある問題と、Power Macintosh G5 に固有の問題について説明します。

[2003 年 6 月 24 日]



はじめに

このテクニカルノートでは、Panther(Mac OS X の次期メジャーバージョン)以降、ドライバの使用時に直面する可能性のある問題について説明します。こうした変更は、ハードウェアと基盤の OS の両方の変更が組み合わさることによって、必然的に発生したものです。しかしながら、この変更に起因する問題が、既存のハードウェアにおいても見られる場合があります。

Panther における基本的な変更部分には、次の 3 つがあります。

  1. IOMemoryDescriptor の変更
  2. VM システム (pmap) の変更
  3. Kernel の依存関係の変更

以降のセクションでは、これらについて詳しく説明します。

先頭に戻る



PCI アドレス変換の基礎知識

既存のデバイスドライバを、来たる 64 ビットシステムのアーキテクチャで動作させるために、いくつかの変更が必要になりました。これらの変更点を説明するにあたり、PCI バスブリッジについて簡単に触れる必要があります。

PCI デバイスがメインメモリとの間でデータの受け渡しを行う必要がある場合、デバイスドライバは、I/O 用にこのメインメモリを準備することを意図した一連の関数を呼び出します。デバイスドライバとメモリサブシステムの両方が 32 ビットアドレス指定を採用しているアーキテクチャでは、I/O 処理中にメモリがページアウトされない限り、すべて正常に機能します。カーネルメモリは一般にページング可能ではないため、対策はほとんど必要ありません。

ただしメモリサブシステムが 64 ビットアドレス指定を採用しているシステムでは、若干問題となります。PCI バス上のハードウェアデバイスは、32 ビットアドレスしか処理できないため、(潜在的にははるかに大容量の)メインメモリのうち、常に 4 ギガバイトまでの範囲しか「認識する」ことができないのです。

この問題を解決するには 2 つの方法が考えられます。簡単な(しかし遅い)解決方法は、「バウンスバッファ」を使うことです。この設計では、デバイスドライバは、メモリの下位 4 ギガの範囲内に明示的に割り当てられたデータをメモリにコピーします。ただしこの動作はパフォーマンスの低下につながり、さらにメモリの下位 4 ギガにも追加の制約を課すため、VM システムに数々の問題を発生させる原因となります。

もう 1 つの方法、すなわちアップルの 64 ビット実装で採用された解決方法は、アドレス変換を使用して、PCI デバイスの 32 ビットアドレス空間にメモリブロックを「マップ」することです。PCI デバイスが認識できるのは依然として 4 ギガの範囲だけですが、非連続範囲にできるため、バウンスバッファやそのほかの制限が不要になります。このアドレス変換は、DART(Device Address Resolution Table:デバイスアドレス解決テーブル)として知られるメモリコントローラの一部を使用して行われます。

しかしこれによって、いくつかの問題が引き起こされる可能性があります。まず、プロセッサによって認識されている物理アドレスは、PCI デバイスによって認識されているアドレスと、もはや 1 対 1 では対応していません。このため、この新しい見方を説明するために、I/O アドレスという新しい言葉を使います。I/O アドレスと物理アドレスはもはや同じものではないため、DART は、この 2 つの間でマッピングを行う場合に使用すべき変換テーブルを保持する必要があります。幸い、アップルのガイドラインに従った(ガイドラインに明記されている API のみを使った)ドライバであれば、この処理は自動的に行われます。

先頭に戻る



IOMemoryDescriptor の変更点

ドライバが IOMemoryDescriptor::prepare を呼び出すと、マッピングが DART に自動的に追加されます。IOMemoryDescriptor::release を呼び出すと、マッピングは削除されます。この処理を行わなかった場合には、ドライバがデータのランダムな欠落またはパニックに遭遇する可能性があります。

DART ではデータの読み込みと書き込みに異なるキャッシュを必要とするため、DART を搭載したハードウェアにおいては、DMA の方向が重要です。一般に(どのようなシステムでも)方向が正しくないと、失敗がランダムに発生しますが、DMA の方向が読み取り用に設定されているメモリ領域で WriteBytes を呼び出そうとすると、64 ビットハードウェアでカーネルパニックが発生します。

参照先メモリ(ユーザメモリ)に対して DMA トランザクションを実行しようとすると、以前のシステムでは、ランダムなクラッシュ、パニック、データ欠落などが生じるだけでした。DART を搭載したコンピュータでは、データをまったく受け取れないでしょう。

メモリサブシステムにおける変更の副作用として、Mac OS X は、メモリ領域に物理的に連続したページ範囲を返す可能性が高くなります。従来、Mac OS X は、複数ページのメモリ領域を返すときには、最後のページから最初のページへと逆の順番で返していました。この結果、必然的に、複数ページからなるメモリ領域が、物理的なページの連続した範囲になることはありませんでした。

メモリ領域内で物理的に連続したメモリブロックを認識する可能性が高まったことから、この変更によって、物理ページの連続した範囲を処理するときだけに見られる、不正な動作やパニックにつながる潜在的な不具合が、一部のドライバで発生することが考えられます。

上述の問題は、ドライバの不具合が原因で発生し、Panther よりも前の古いハードウェアで問題となる場合があります。しかし、新しいハードウェア設計と、それをサポートするためになされた OS の変更が原因で、Panther とそれ以降の Mac OS X の バージョンでは、これらの問題が発生する可能性はさらに高くなります。

先頭に戻る



VM システムと pmap の変更点

Panther では、PCI アドレス変換のセクションで詳しく説明した変更の結果、pmap レイヤから直接取得した物理アドレスは、VM システム自体の外部では意味をなしません。デバイスドライバでこうした使い方の間違いを避けるために、pmap の呼び出しはカーネル拡張からはもはや利用できないようになっています。

IOMemoryDescriptor クラスが追加される前に書かれたいくつかのドライバでは、依然として pmap の呼び出しを使って仮想アドレスと結び付いている物理ページを取得します。また、デベロッパの中には、IOMemoryDescriptor の実装を考慮して、pmap レイヤからアドレスを直接取得するようにして、不要な抽象レイヤと見なされたものを排除した人もいます。

pmap の呼び出しへのアクセスを削除しない場合でも、これらのドライバは、DART(DART については上述の PCI セクションを参照)を搭載したシステムでは機能しないことが考えられます。今後生じるであろうこれらの失敗を先取りして、Panther では、DART のないシステムでも、(一般的に pmap_extract に対する)未定義のシンボルエラーで、これらのドライバの読み込みを失敗させます。

先頭に戻る



Kernel 依存関係の変更点

Panther からは、I/O Kit のバージョン 7(Panther のバージョン)に対する依存関係を宣言するデバイスドライバは、もはや Mach と BSD からシンボルを自動的に取得しません。このような変更がなされたのは、I/O Kit での使用が明示的に承認されていないシンボルを使用しないことをデベロッパの方に推奨するためです。

既存のドライバは、この変更による影響を受けません。この変更によって影響が生じるのは、I/O Kit の新しい機能を利用するために I/O Kit のバージョン 7 との依存関係を宣言するように、デバイスドライバを明示的に変更している場合に限られます。

先頭に戻る



要約

上述のように、デバイスドライバによっては、Panther 以降のバージョンをサポートするために、細かい変更が必要になることがあります。アップルは、既存のデバイスドライバとの互換性を可能な限り広い範囲で保証するためにあらゆる努力を行っていますが、ドライバによっては動作しなくなる場合があります。ドライバが動作しなくなった場合は、まず初めに、上述の不具合がドライバに含まれていないかを調べてください。不具合がなかった場合は、アップルのデベロッパテクニカルサポート にアクセスして、デバッグに関する追加情報を見つけてください。